import json
import re
import os
import time

import cv2
from pyzbar.pyzbar import decode
import urllib.parse
import requests
from AutoLogin import load_config, get_captcha_img, post_login

def decode_qrcode(image_path: str):
    """
    读取图像，解码二维码，并提取二维码数据。
    """
    # 读取图像
    img = cv2.imread(image_path)

    # 解码二维码
    detected_barcodes = decode(img)

    # 遍历解码的二维码
    for barcode in detected_barcodes:
        # 提取二维码的边界框位置
        rect = barcode.rect
        cv2.rectangle(img, (rect.left, rect.top),
                      (rect.left + rect.width, rect.top + rect.height),
                      color=(0, 255, 0), thickness=2)

        # 解码数据
        barcode_data = barcode.data.decode("utf-8")
        barcode_type = barcode.type

        # 显示解码结果
        print(f"二维码数据: {barcode_data}, 类型: {barcode_type}")

        # 在图像上绘制文本
        cv2.putText(img, barcode_data, (rect.left, rect.top - 10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

    # 返回二维码数据
    return barcode_data


def extract_params(url: str):
    """
    解析 URL，并提取 rd 参数的内容，解码并提取 seqCode 和 hash。
    """
    # 解析 URL
    parsed_url = urllib.parse.urlparse(url)

    # 提取查询参数部分
    query_params = urllib.parse.parse_qs(parsed_url.query)

    # 获取 rd 参数并进行解码
    rd_param = query_params.get('rd')[0]  # rd参数值
    decoded_rd_param = urllib.parse.unquote(rd_param)  # 解码

    print("Decoded rd param:", decoded_rd_param)

    # 使用正则表达式提取 seqCode 和 hash
    seq_code_match = re.search(r'seqCode=({.*?})', decoded_rd_param)
    hash_match = re.search(r'hash=([a-fA-F0-9]{32})', decoded_rd_param)

    # 检查是否匹配成功
    if seq_code_match and hash_match:
        # 提取 seqCode 和 hash
        seq_code = seq_code_match.group(1)
        hash_value = hash_match.group(1)

        # 将 seqCode 从 JSON 字符串转换为 Python 字典
        seq_code_dict = json.loads(seq_code)

        # 提取 transcriptId
        transcript_id = seq_code_dict.get('transcriptId')

        print("Transcript ID:", transcript_id)
        print("Hash:", hash_value)
        return transcript_id, hash_value
    else:
        print("无法匹配到 seqCode 或 hash")
        return None, None


def submit_evaluation(transcript_id: str, hash_value: str, token: str):
    """
    提交评估数据到指定 URL。
    """
    url = "http://27.37.67.47/admin/ReflectionMeeting/submitEvaluationForm"

    headers = {
        "Authorization": f"Bearer {token}",
        "Cookie": f"sidebarStatus=0; Admin-Token={token}",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
    }

    # 使用占位符构建请求体数据
    data = {
        "seqCode": f"{{\"formType\":\"ClassmatesEvaluation\",\"transcriptId\":{transcript_id}}}",
        "formData": "{\"morality\":80,\"intelligence\":80,\"physique\":80,\"aesthetics\":80,\"labour\":80}",
        "hash": hash_value
    }

    # 发送 POST 请求
    response = requests.post(url, headers=headers, json=data)
    data_res = response.json()
    # 打印响应状态码和内容
    return data_res


if __name__ == "__main__":
    """
    # 文件夹路径
    folder_path = 'wuyucode'  # 请替换为实际文件夹路径


    # 加载自动登录配置
    config = load_config()
    username = config['username']
    password = config['password']
    uuid, cap_code = get_captcha_img()
    token = post_login(username, password, uuid, cap_code)

    # 遍历文件夹中的所有 JPG 文件
    for filename in os.listdir(folder_path):
        if filename.lower().endswith('.jpg'):
            file_path = os.path.join(folder_path, filename)
            print(f"处理文件: {file_path}")

            # 解码二维码
            url = decode_qrcode(file_path)

            # 提取参数
            transcript_id, hash_value = extract_params(url)

            # 提交评估数据
            if transcript_id and hash_value:
                submit_evaluation(transcript_id, hash_value, token)
                print("评估数据已提交")
        time.sleep(5)
        print("等待5秒")
            """

